package com.topone.service.impl;

import com.topone.Enum.CouponEnum;
import com.topone.Enum.ResultEnum;
import com.topone.Exception.FanZoneException;
import com.topone.dataObject.Bussiness;
import com.topone.dataObject.Mapper.BussinessMapper;
import com.topone.dataObject.Mapper.CouponMapper;
import com.topone.dataObject.TcCoupon;
import com.topone.dataObject.TcUserCoupon;
import com.topone.dto.BussinessDTO;
import com.topone.dto.CartDTO;
import com.topone.dto.TcCouponDTO;
import com.topone.dto.TcUserCouponDTO;
import com.topone.repository.BussinessRepository;
import com.topone.repository.TcCouponRepository;
import com.topone.service.TcCouponService;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.List;

/**
 * 查询优惠券信息
 * Created by Administrator on 2017/11/6,0006.
 */
@Service
@Slf4j
public class TcCouponServiceImpl implements TcCouponService {
    @Autowired
    private TcCouponRepository repository;

    @Autowired
    private CouponMapper couponMapper;

    @Autowired
    private BussinessMapper bussinessMapper;


    //查询单个优惠券
    @Override
    @Transactional
    public TcCoupon findOne(String couponId) {
        return repository.findOne(couponId);
    }

    @Override
    @Transactional
    public Page<TcCoupon> findAll(Pageable pageable) {
        return repository.findAll(pageable);
    }

    @Override
    @Transactional
    public List<TcCoupon> findUpAll(Integer status){
        return repository.findByCouponStatus(status);
    }

    //查询商家所有优惠券
    @Override
    @Transactional
    public List<BussinessDTO> findAllByStatus(TcCouponDTO tcCouponDTO){
         List<BussinessDTO> list=couponMapper.queryCouponList(tcCouponDTO);
         if(list.size()==0){
             list.add(bussinessMapper.findBussinessItemById(tcCouponDTO.getBussinessId()));
         }
         return list;
    }

    //根据商家id查询优惠券
    @Override
    @Transactional
    public List<TcCoupon> findCouponByBussinessId(String bussinessId) {
        //根据商家id查询优惠券
        List<TcCoupon> tcCouponList= repository.findByBussinessIdEqualsAndCouponStatusEquals
                (bussinessId,CouponEnum.UP.getCode());
        return tcCouponList;
    }

    @Override
    @Transactional
    public List<TcCouponDTO> findAllCoupon(Integer status) {
        return couponMapper.findCouponList(status);
    }

    @Override
    @Transactional
    public List<TcCouponDTO> paymentCoupon(String bussinessId, String couponId) {
        return couponMapper.paymentCouponList(bussinessId,couponId);
    }

    @Override
    @Transactional
    public List<TcUserCouponDTO> findphoneBycouponId(String couponId, String openid) {
        return couponMapper.findphoneBycouponId(couponId,openid);
    }

    public TcCoupon save(TcCoupon tcCoupon){
        return  repository.save(tcCoupon);
    }

    //添加优惠券库存
    @Override
    @Transactional
    public void increaseStock(List<CartDTO> couponDtoList) {
        for (CartDTO cartDTO:couponDtoList){
            TcCoupon tcCoupon=repository.findOne(cartDTO.getCouponId());
            if(tcCoupon==null){ //如果查询不到tccoupon信息
               // log.error("【添加优惠券操作失败】:优惠券编号为{}不存在",couponDto.getCouponId());
               throw new FanZoneException(ResultEnum.COUPON_NOT_EXIT);
            }else {
               Integer num=tcCoupon.getCouponStock()
                       +cartDTO.getCouponQuanlity();
               tcCoupon.setCouponStock(num);
               repository.save(tcCoupon);
               log.info("【添加优惠券操作成功】:入库{}条",cartDTO.getCouponQuanlity());
            }
        }
    }
    //减少优惠券库存
    @Override
    @Transactional
    public void decreaseStock(List<CartDTO> couponDtoList) {
          for(CartDTO cartDTO:couponDtoList){
              TcCoupon tcCoupon=repository.findOne(cartDTO.getCouponId());
              if(tcCoupon==null){
                  log.error("【减优惠券操作失败】:优惠券编号为{}不存在",cartDTO.getCouponId());
                  throw new FanZoneException(ResultEnum.COUPON_NOT_EXIT);
              }else {
                  Integer num=tcCoupon.getCouponStock()-cartDTO.getCouponQuanlity();
                  if(num<0){
                      log.error("【减优惠券操作失败】:优惠券编号为{}的库存不足",tcCoupon.getCouponId());
                      throw new FanZoneException(ResultEnum.COUPON_IS_OVER);
                  }else {

                  }
                  tcCoupon.setCouponStock(num);
                  repository.save(tcCoupon);
                  log.info("【扣优惠券操作成功】:减库存{}条",cartDTO.getCouponQuanlity());
              }
          }
    }

    @Override
    @Transactional
    public TcCoupon onSale(String couponId) {
        TcCoupon tcCoupon=repository.findOne(couponId);
        if(tcCoupon==null){
           log.error("【卖家端上架优惠券】优惠券不存在 couponId={}",couponId);
            throw new FanZoneException(ResultEnum.COUPON_NOT_EXIT);
        }
        if(tcCoupon.getCouponStatus()==(CouponEnum.UP).getCode()){
            log.error("【卖家端上架优惠券】优惠券状态不正确 couponStatus={}"
                    ,tcCoupon.getCouponStatus());
            throw new FanZoneException(ResultEnum.COUPON_STATUS_ERROR);
        }
        //更新
        tcCoupon.setCouponStatus(CouponEnum.UP.getCode());
        return repository.save(tcCoupon);
    }

    @Override
    @Transactional
    public TcCoupon offSale(String couponId) {
        TcCoupon tcCoupon=repository.findOne(couponId);
        if(tcCoupon==null){
            log.error("【卖家端下架优惠券】优惠券不存在 couponId={}",couponId);
            throw new FanZoneException(ResultEnum.COUPON_NOT_EXIT);
        }
        if(tcCoupon.getCouponStatus()==(CouponEnum.DOWN.getCode())){
            log.error("【卖家端下架优惠券】优惠券状态不正确 couponStatus={}"
                    ,tcCoupon.getCouponStatus());
            throw new FanZoneException(ResultEnum.COUPON_STATUS_ERROR);
        }
        //更新
        tcCoupon.setCouponStatus(CouponEnum.DOWN.getCode());
        return repository.save(tcCoupon);
    }

    //查找所有折扣券
    @Override
    public List<TcCouponDTO> findDiscountCoupon(Integer status) {
        return couponMapper.findDiscountCouponList(status);
    }

    //查找所有代金券
    @Override
    public List<TcCouponDTO> findCashCoupon(Integer status) {
        return couponMapper.findCashCouponList(status);
    }

    //查找免费优惠券
    @Override
    public List<TcCouponDTO> freeCoupon(Integer isFlashsale) {
        return couponMapper.findfreeCouponList(isFlashsale);
    }

    //限时抢购优惠券
    @Override
    public List<TcCouponDTO> findFlashSaleCoupon(Integer isFlashsale) {
        return couponMapper.findFlashSaleCouponList(isFlashsale);
    }

    //优惠券超时处理(查询)
    @Override
    @Transactional
    public List<TcCouponDTO> dealCouponOverTime() {
        List<TcCouponDTO> tcCouponDTOList=couponMapper.findCouponOverTimeList();
      try {
            if(tcCouponDTOList!=null && tcCouponDTOList.size()>0){
             for (int i=0;i<tcCouponDTOList.size();i++){
                 cancelCouponOverTime(tcCouponDTOList.get(i).getCouponId());
                 log.info("更新过期优惠券成功,couponId={}",
                         tcCouponDTOList.get(i).getCouponId());
             }
            }
      }catch (FanZoneException e){
          log.error("处理超时优惠券失败,{}",e.getMessage());
           e.printStackTrace();
      }
        return tcCouponDTOList;
    }

    //优惠券超时处理(更新)
    @Override
    @Synchronized
    public void cancelCouponOverTime(String couponId) {
        try {
            couponMapper.cancelCouponList(couponId);
        }catch (FanZoneException e){
            log.error("删除超时优惠券失败,{}",e.getMessage());
            e.printStackTrace();
        }

    }

    //根据优惠券名称,模糊查询优惠券
    @Override
    public List<TcCouponDTO> queryCouponNameLikeList(String couponName){
        try {
           return  couponMapper.queryCouponNameLikeList(couponName);
        }catch (FanZoneException e){
            log.error("【限时抢购】删除超时优惠券失败,{}",e.getMessage());
            e.printStackTrace();
        }
        return null;
    }
}
